//
//  SLUserAccountViewModel.swift
//  langligelang
//
//  Created by 秦－政 on 2016/10/25.
//  Copyright © 2016年 pete. All rights reserved.
//

import UIKit

// 自定义类
class SLUserAccountViewModel {
    // 使用频繁 可能有多个模块使用
    // 全局访问点
    static let sharedTools:SLUserAccountViewModel = SLUserAccountViewModel()
    // 用户信息对象
    var userAccountModel:SLUserAccountModel?
    // 路径
    let file = (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last! as NSString).appendingPathComponent("userAccount.archiver")
    /// 判断用户是否登录
    /*
     - 如果用户登录 (用户登录了 而且没有过期)
     - 如果用户没有登录(真的没有登录过 , 用户登录过 但是过期了)
     - 需要每次使用均需要判断下 所以使用计算型属性
     */
    var isLogin:Bool{
    // 简写 如果accessToken != nil 满足的话就是 true
        return accessToken != nil
    }
    /// 访问令牌
    var accessToken:String?{
        // 代表用户登录过 而且保存过数据
        // 需要判断是否过期了么
        // 如果过期时间和当前时间比较 == 降序 代表没有过期
        if userAccountModel?.expires_Date?.compare(Date()) == ComparisonResult.orderedDescending {
            return userAccountModel?.access_token
        }else{
            return nil
        }
    }
    // 没有继承的类 也需要实现 init 方法(如果外界调用sharedTools 就会走 init 方法 我们需要给单例对象身上userAccountModel 赋值)
    init() {
        // 用户模型赋值
        userAccountModel = getUserAccountModel()
    }
}
// MARK: - 提控制器获取数据
extension SLUserAccountViewModel{
    // 获取 token
    func getUserAccount(code: String,finish:@escaping (Bool)->()){
        // 发送请求
        SLNetworkTools.sharedTools.oauthLoadUserAccount(code: code, success: { (response) in
            print("请求成功",response)
            // 判断response 是否为 nil 而且是否可以转成字典
            // guard 或者 if-let 判断就是可选值 所以如果转成你想要的类型 需要使用 as? 即可
            guard let res = response as?[String :Any] else{
                finish(false)
                return
            }
            // 字典转模型
            let userAccountModel = SLUserAccountModel.yy_model(withJSON: res)
            
            // 判断userAccountModel 不为nil
            guard let model = userAccountModel else {
                finish(false)
                return
            }
            // 获取用户信息
            self.getUserInfo(model: model,finish: finish)
            
        }) { (error) in
            
            finish(false)
            print("第一次请求失败",error)
        }
    }
//     请求用户信息
        func getUserInfo(model:SLUserAccountModel, finish:@escaping (Bool)->()){
            // 请求的URLString
           
            SLNetworkTools.sharedTools.oauthLoadUserInfo(model: model, success: { (response) in
                
                // 判断response 是否为nil 而且可以转成一个字典
                guard let res = response as?[String :Any] else{
                    finish(false)
                    return
                }
                // 因为后期需要保存该模型 直接使用 一个 model 即可 需要直接手动赋值]
                model.screen_name = res["screen_name"] as? String
                model.avatar_large = res["avatar_large"] as? String
                // 保存模型
                self.saveUserAccountModel(model: model)
                // 最终的成功的执行闭包
                finish(true)
                }) { (error) in
                    finish(false)
                    print("最后一次请求失败",error)
            }
            
        }

}
// MARK: - 归档解档
extension SLUserAccountViewModel{
    // 保存用户信息对象
    func saveUserAccountModel(model: SLUserAccountModel){
        // 因为首次使用该类的时候 会走 init 方法 但是我们第一次登陆 app 根本没有保存过个人信息数据 导致userAccountModel 为 nil
        // 解决方法 需要外界调用该方法保存用户对象的时候 程序员手动给单例对象的userAccountModel 赋值
        userAccountModel = model
        NSKeyedArchiver.archiveRootObject(model, toFile: file)
    }
    
    func getUserAccountModel() ->SLUserAccountModel?{
        
        let result = NSKeyedUnarchiver.unarchiveObject(withFile: file)as?SLUserAccountModel
        return result
        
    }
    
    
}
